#include "TaskQueue.h"

TaskQueue::TaskQueue(int queSize)
    : _queSize(queSize),
      _queue(),
      _mutex(),
      _NotFull(_mutex),
      _NotEmpty(_mutex),
      _flag(true)
{
}

bool TaskQueue::empty()
{
    return 0 == _queue.size();
}
bool TaskQueue::full()
{
    return _queSize == _queue.size();
}
void TaskQueue::push(Task task)
{
    MutexLockGuard autolock(_mutex);
    while (full())
    {
        _NotFull.wait();
    }
    _queue.push(task);
    _NotEmpty.notify();
}
Task TaskQueue::pop()
{
    Task temp;
    MutexLockGuard autolock(_mutex);
    while (_flag && empty())
    {
        _NotEmpty.wait();
    }
    if (_flag)
    {
        temp = _queue.front();
        _queue.pop();
        _NotFull.notify();
    }
    else
    {
        temp = nullptr;
    }

    return temp;
}
void TaskQueue::wakeup(){
    _flag = false;
    _NotEmpty.notifyAll();
}